
import java.util.ArrayList;


public class Process {

    private int idProcess;
    private HorlogeLamport horloge;
    private Pere pere;
    private Tampon tamponDeTrace;
    private Client client;
    private Tampon tamponDeReception;
    private Recepteur recepteur;
    private Tampon tamponDEmission;
    private Emetteur emetteur;
    private int numPortRecepeteur;
    private int numPortEmmeteur;
    // Variable ou sera stocké tous les numéros des ports récepteurs des voisins et le celui du process
    private ArrayList<Integer> listNumPort;
    // Tableau de tampon d'emission
    private ArrayList<Tampon> tableauTamponEmetteur;
    // Tableau de thread Emetteur
    private ArrayList<Emetteur> tableauEmetteur;
    // Tableau de tous les process
    private ArrayList<Process> tableauProcess;
    // File de requête commune à tous les process
    FileDeRequetes fileDeRequetes;
    
    private int numPortServeurSVG = 8080;

    // Constructeur utilisé jusqu'au jalon 12
    public Process(int _numProcess, int _numPortRecepteur, int _numPortEmetteur) {
        this.idProcess = _numProcess;
        this.numPortRecepeteur = _numPortRecepteur;
        this.numPortEmmeteur = _numPortEmetteur;
        
        
        horloge = new HorlogeLamport(this);

        tamponDEmission = new Tampon(this);
        tamponDeReception = new Tampon(this);
        tamponDeTrace = new Tampon(this);

        System.out.println(this.idProcess + " : Creation du processus");
    }
    
    // Constructeur utilisé à partir du jalon 13
    public Process(int _numProcess, int _numPortRecepteur, ArrayList _listeNumeroPort, FileDeRequetes _fileDeRequetes)
    {
        this.idProcess = _numProcess;
        this.numPortRecepeteur = _numPortRecepteur;
        this.listNumPort = _listeNumeroPort;
        this.fileDeRequetes = _fileDeRequetes;
        
        horloge = new HorlogeLamport(this);
      
        tamponDeReception = new Tampon(this);
        tamponDeTrace = new Tampon(this);
        
        
        // Création des différents des tampons et ajouts dans le tableau
        tableauTamponEmetteur = new ArrayList<Tampon>();
        for(int i=0;i<listNumPort.size()-1;i++)
        {
            tableauTamponEmetteur.add(new Tampon(this));
        }
        
        System.out.println("Taille du tableau de tampon d'emission = " + tableauTamponEmetteur.size());
        System.out.println(this.idProcess + " : Creation du processus");
        
    }

    public void lanceReception() {
        recepteur = new Recepteur(this, numPortRecepeteur);
        System.out.println(this.idProcess + " : Creation du recepteur");
        recepteur.start();
    }

    public void lanceEmission(ArrayList<Process> _listeProcess) {
        
        tableauProcess = _listeProcess;
        // Création d'un tableau de process temporaire pour enlever le process lui-même de ce tableau        
        ArrayList<Process> tableuProcessTemp = new ArrayList<Process>();
        for(int i=0;i<tableauProcess.size();i++)
        {
            if(tableauProcess.get(i).getIdProcess() != idProcess)
            {
                tableuProcessTemp.add(tableauProcess.get(i));
            }
        }              
        
        // Création du tableau emetteur 
        tableauEmetteur = new ArrayList<Emetteur>();
        for(int i=0;i<tableuProcessTemp.size();i++)
        {
            tableauEmetteur.add(new Emetteur(this, tableuProcessTemp.get(i).getNumPortRecepeteur(), tableauTamponEmetteur.get(i),tableuProcessTemp.get(i).getIdProcess()));
            tableauEmetteur.get(i).start();
            System.out.println(this.idProcess + " : Creation de l'emetteur " + i);
        }
    }

    public void lanceClient() {
        client = new Client(this, numPortServeurSVG);
        client.start();
        System.out.println(this.idProcess + " : Creation du client");
    }

    public void lancePere() {
        pere = new Pere(this);
        System.out.println(this.idProcess + " : Creation du pere");
        pere.start();
    }

    public int getIdProcess() {
        return this.idProcess;
    }

    public HorlogeLamport getHorloge() {
        return this.horloge;
    }

    public Pere getPere() {
        return this.pere;
    }

    public Tampon getTamponDeTrace() {
        return this.tamponDeTrace;
    }

    public Client getClient() {
        return this.client;
    }

    public Tampon getTamponDeReception() {
        return this.tamponDeReception;
    }

    public Recepteur getRecepteur() {
        return this.recepteur;
    }

    public Tampon getTamponDEmission() {
        return this.tamponDEmission;
    }

    public Emetteur getEmetteur() {
        return this.emetteur;
    }

    public ArrayList<Integer> getListNumPort() {
        return listNumPort;
    }

    public ArrayList<Emetteur> getTableauEmetteur() {
        return tableauEmetteur;
    }

    public ArrayList<Tampon> getTableauTamponEmetteur() {
        return tableauTamponEmetteur;
    }

    public int getNumPortEmmeteur() {
        return numPortEmmeteur;
    }

    public int getNumPortRecepeteur() {
        return numPortRecepeteur;
    }

    public ArrayList<Process> getTableauProcess() {
        return tableauProcess;
    }
    
    public FileDeRequetes getFileDeRequete()
    {
        return fileDeRequetes;
    }
  
}
